Cinemachine Camera
转载自知乎用户:Ouroboros
文章地址:https://zhuanlan.zhihu.com/p/516625841
本篇节选了body部分
在阅读以下文章之前先了解以下概念
- Pitch Axis:俯仰轴
- Roll Axis:翻转轴
- Yaw Axis:航向轴
这三个轴与x,y,z坐标轴不同概念
Body
打开Body组件界面有7种算法
以下图片出现黄色感叹号是因为Follow没有挂载跟随目标
Do nothing
选择该算法后,该虚拟相机的坐标不会移动更新,通常为静态镜头选择此算法或使用自定义脚本直接为相机位置设置动画。通常和LookAt配合使用,模拟固定位置的跟随镜头。
3rd Person Follow
选择该算法后虚拟相机会自动跟随任务移动,就是常见的第三人称视角
变量 | 含义 |
---|---|
Damping | 阻尼系数,指摄像机向x,y,z轴三个方向移动反应速度,系数越小反应越快,系数越大反应越慢,可以通过调整三个不同方向轴的阻尼系数来实现不同的移动效果。 |
Shoulder Offset | 相对于跟随目标原点的肩膀支点的位置。这个偏移量位于目标模型空间。 |
Vertical Arm Length | 手相对于肩膀的垂直偏移量。当相机垂直旋转时,arm长度会影响跟踪目标在屏幕空间的偏移。 |
Camera Side | 明确哪个位置是相机的肩膀(0-1,代表left,in-between,right三种状态) |
Camera Distance | 相机的手部位置会被放置多远距离 |
Camera Collision Fiter | 相机碰撞过滤器,相机会自动避免阻碍这些层。有以下成员:Nothing/Everything/default/TransparentFX/Ignore Raycast/Water/UI |
Ignore Tag | 检测忽略的Tag |
Camera Radius | 虚拟相机会尽量与遮挡物保持不低于这个距离。如果你看到由于较大的FOV导致相机穿透了遮挡物内部,可以适当增加这个值。 |
Framing Transposer
此虚拟相机本身算法将相机以固定的屏幕空间关系移动到跟随目标。您还可以指定偏移、阻尼和合成规则。Framing Transposer只改变相机在空间中的位置。它不会重新定向或以其他方式瞄准相机。
Framing Transposer专为 2D 和正交相机而设计。但它也适用于透视相机和 3D 环境。
此算法首先沿相机 Z 轴移动相机,直到跟随目标与相机的 XY 平面处于所需距离。然后在其 XY 平面中移动相机,直到跟随目标位于相机屏幕上的所需点。
注意:Framing Transposer忽略 LookAt 目标 - 仅使用 Follow 目标。
如果Follow目标是Target Group,则可以使用其他属性来构建整个组。
面版
变量 | 含义 |
---|---|
Tracked Object Offse | 对跟随目标对象的偏移量(在目标-局部坐标中)。相机将尝试框定目标位置加上此偏移量的点。当目标原点不是目标点时,使用它来校正相机 |
Lookahead Time | 根据目标的运动,调整虚拟相机与“跟随”目标的偏移量。Cinemachine预测目标在未来数秒之内到达的位置并提前设置Unity相机的位置。这个功能对微动的动画敏感,并且会放大噪点,导致非预期的相机抖动。如果不能接受目标运动时的相机抖动,减小这个属性可能会使相机动画更流畅。 |
Lookahead Smoothing | 预测算法的平滑度。较大的值可以消除抖动但会使预测滞后。 |
Lookahead Ignore Y | 如果选中,则忽略沿 Y 轴的移动以进行预测计算。 |
X ,Y,Z Damping | 相机尝试保持 x ,y,z轴偏移的响应程度。小数字使相机更灵敏。数字越大,相机响应越慢。每个轴使用不同的设置可以产生广泛的相机行为。 |
Target Movement Only | 如果启用此选项,则阻尼仅适用于目标的运动。相机旋转更改将绕过阻尼。 |
Screen X,Y | 目标的水平,垂直屏幕位置。相机移动的结果是使目标处于此位置。 |
Camera Distance | 沿摄像机Z轴与跟随目标保持的距离。 |
Dead Zone Width | 当目标在此位置范围内时,不会水平移动相机 |
Dead Zone Height | 当目标在此位置范围内时,不会垂直移动相机。 |
Dead Zone Depth | 当跟随目标距离相机在此范围内时,不会沿其z轴移动相机。 |
Unlimited Soft Zone | 如果选中,Soft Zone没有边界 |
Soft Zone Width | 当目标处于此范围内时,会水平移动相机,将目标移回到Dead Zone中。Damping属性会影响摄像机的运动速度。 |
Soft Zone Height | 当目标处于此范围内时,会垂直移动相机,将目标移回到Dead Zone中。Damping属性会影响摄像机的运动速度。 |
Bias X,Y | Soft Zone的中心与目标位置的水平,垂直偏移。 |
Center On Active | 选中时,虚拟相机激活时会将镜头中心对准物体。不选中时,虚拟相机会将目标物体放置在最近的dead zone边缘。 |
非常详细不用介绍了
Hard Lock To Target
该算法实现虚拟相机和跟随目标使用相同位置。可以用作第一人称
Orbital Transposer
这个算法支持相机和目标之间的可变相对位置关系。可以接受玩家的输入,动态的控制相机的位置。
Orbital Transposer引入了一个新的概念叫heading,代表了目标移动的方向或面朝的方向。Orbital Transposer会尝试移动相机,让镜头朝向heading的方向。默认情况下,相机的位置会在target的正后面。也可以通过Heading Bias属性设置。如果给Orbital Transposer添加了输入控制器,玩家就可以控制相机围绕目标旋转。可以设置为Input Manager中的轴,也可以直接用脚本控制。
当Recenter To Target Heading属性选中时,在没有输入时Orbital Transposer可以自动重新居中相机。
变量 | 含义 |
---|---|
Binding Mode | 解释虚拟摄像机与跟随目标的偏移时要使用的坐标空间。 |
Follow Offset | 跟随目标时的位置偏移 |
X Damping | 相机在X轴上移动的阻力系数。较小的值会使相机反应更快。较大的值会使相机的反应速度变慢。每个轴使用不同的设置可以制造出各种类型相机的行为。 绑定模式为Simple Follow With World Up时不可用。 |
Y Damping | 相机尝试保持 y 轴偏移的响应速度。小数字使相机更灵敏。数字越大,相机响应越慢。 |
Z Damping | 相机尝试保持 z 轴偏移的响应程度。小数字使相机更灵敏。数字越大,相机响应越慢。 |
Yaw Damping | 相机在y轴旋转的阻力系数。较小的数字会使相机反应更快。较大的数字会使相机的反应速度变慢。每个轴使用不同的设置可以制造出各种类型相机的行为。Binding Mode为Lock to Target With World Up、Lock to Target No Roll、Lock to Target时可用。 |
Pitch Damping | 相机在x轴旋转的阻力系数。较小的数字会使相机反应更快。较大的数字会使相机的反应速度变慢。 Binding Mode为Lock to Target No Roll、Lock to Target时可用。 |
Roll Damping | 相机在z轴旋转的阻力系数。较小的数字会使相机反应更快。较大的数字会使相机的反应速度变慢。 Binding Mode为Lock to Target时可用。 |
Heading | 指定如何计算跟随目标的航向。 |
Recenter To Target Heading | Orbital Transposer __可选地自动将相机重新居中。选中__Recenter To Target Heading 后,Orbital Transposer 会自动将相机移回目标航向。您可以指定在检测到没有用户输入后要等待的时间长度以及重新定位的速度。 |
X Axis | 航向控制。此处的设置控制相机响应玩家输入的行为。 |
- Binding Mode
- Lock To Target On Assign:本地空间,相机被激活或target赋值时的相对位置。
- Lock To Target With World Up:本地空间,保持相机y轴朝上,yaw和roll为0。
- Lock To Target No Roll:本地空间,锁定到目标物体,roll为0。
- Lock To Target:本地空间,锁定到目标物体 。
- World Space:世界空间 。
- Simple Follow With World Up:相对于目标的位置,使用相机的本地坐标系,保持相机y轴朝上。
- Heading
Definition:计算Follow朝向的方法
- Position Delta 以根据上次更新和当前帧的目标位置差异来计算航向。
- Velocity 以使用目标刚体的速度。 如果目标没有刚体组件,则恢复到位置增量。
- Target Forward 以使用目标的本地 Forward 轴作为航向。
- World Forward 以使用恒定的世界空间 Forward 作为航向。
- Velocity Filter Strength:在定义中使用 Position Delta 或 Velocity 时控制速度的平滑。
Bias:相对于航向放置相机的轨道中的角度偏移。 以度为单位。 轴值为 0 会将相机放在此处。
- Recenter To Target Heading
Wait Time:如果在轴上没有检测到用户输入,相机会在重新定位之前等待这么长时间(以秒为单位)。
Recentering Time:重新自动定位居中的过程花费的时间.
- X Axis
Value:当前值
Value Range :值范围
Wrap:如果选中,则轴在 Min 和 Max 值之间形成一个循环。
Speed :最大速度(Max Speed)或者最大增加速度(Input Value Gain)
Accel Time :加速到最高速度所需要的时间
Input Axis Name:在 Unity 输入管理器中指定的此轴的名称。 设置为空字符串以禁用此轴的自动更新。
Input Axis Value:玩家输入轴的值。值0表示没有输入。可以通过编写脚本控制
Invert:是否反转输入的值(取相反数)
Tracked Dolly
这个算法可以让相机沿预定路径移动(轨道相机)。使用Path Position属性来指定将虚拟相机放置在路径上的位置。需Follow目标移动。
使用Auto-Dolly模式将虚拟相机移动到路径上最接近Follow目标的位置。启用后,Auto-Dolly会自动将虚拟相机的位置移动到最接近目标的路径上的位置。
提示:使用Auto-Dolly模式时,一定要谨慎选择路径形状。在围绕某个点形成弧形的路径上可能会有问题。举一个极端的例子,考虑一条以Follow目标为中心的完美圆形路径。路径上最接近目标的点变得不稳定,因为圆形路径上的所有点都同样接近目标。在这种情况下,将Follow目标移动很小的距离会导致相机在轨道上移动很大的距离。
注意此算法一定要有Path
变量 | 含义 |
---|---|
Path | 相机移动的路径。此属性必须引用CinemachinePath或Cinemachine Smooth Path对象。 |
Path Position | 沿路径放置相机的位置。直接给这个属性作动画或启用Auto-Dolly。这个值以Position Units指定的单位为单位。 |
Position Units | 路径位置的度量单位。 |
Path Offset | 相机相对于路径的位置。X 垂直于路径,Y 向上,Z 平行于路径。使用此属性可使相机偏离路径本身 |
X ,Y,Z Damping | 相机尝试保持 x ,y,z轴偏移的响应程度。小数字使相机更灵敏。数字越大,相机响应越慢。每个轴使用不同的设置可以产生广泛的相机行为。 |
Camera Up | 如何为虚拟摄像机设置向上矢量。这会影响屏幕构图,因为相机 Aim 算法尝试尊重向上方向。 |
Auto Dolly | 控制自动轨道位置选择方式。要使用此功能,必须设置Follow目标。 |
- Path
Cinemachine中有两种Dolly Path组件:
- CinemachinePath组件:每个路径点都可以设置位置、切线和翻转角度,可以最大程度控制路径。但是如果切线设置的不合理,相机在路径上运动时可能会有不稳定的现象。
- CinemachineSmoothPath组件:每个路径点都可以设置位置和翻转角度。组件中会使用Bezier算法来推算路径点之间的位置。虽然SmoothPath不能完全控制路径,但是整个路径会更平滑和连续。推荐优先使用。可以避免出现,尽管路径位置始终是平滑连续的,但沿路径设置动画时仍然可能会产生不稳定的现象。
- 额外扩展:什么是Bezier算法和Bezier曲线
Bezier曲线
Bezier算法
详细的算法推导可以在上述链接中观看如何逐阶层运算各个阶的Bezier曲线。
Unity本身自带的CinemachineSmoothPath脚本源码,他们是定义一个世界空间路径,由一组路点组成,每个路点都有位置和滚动设置。Bezier 插值在航点之间执行,以获得平滑和连续的路径。 计算距离缓存时,对点之间的路径进行多次采样。路径将通过所有航路点,并且(与 CinemachinePath 不同)保证一阶和二阶连续性。
源码都是运算过程,大家可以自行观看。
- 如何创建Dolly Path
- 方法一:如果是在相机上制作路径动画,可以直接创建Dolly Camera。菜单栏Cinemachine > Create Dolly Camera with Track。点击后会创建一个虚拟相机和dolly path。这个Path默认是SmoothPath。虚拟相机会自动设置好Body属性为Dolly Track并且Path属性赋值为创建出来的Dolly path。
- 方法二:如果是给GameObject制作路径动画,可以直接创建Dolly Cart。菜单栏Cinemachine > Create Dolly Track With Cart。点击后会创建一个虚拟相机和DollyCart。这个Path默认是SmoothPath。只需要把做路径动画的物体作为Cart的子物体即可。
- 方法三:直接创建Dolly Path。创建一个空物体,给空物体添加CinemachinePath或CinemachineSmoothPath组件。
- SmoothPath参数详解
Resolution: 每个路径点之间采样的次数。Cinemachine在计算路径距离时使用此值来限制粒度。场景视图中路径Gizmo上的交叉线反映了该值。
Appearance :路径在场景中显示的外观。只在编辑器中生效。
Path Color :选中路径时的颜色。
Inactive Path Color :未选中路径的颜色。
Width :路径轨道的宽度。
Looped :选中后,路径会首尾相连。
Path Length :整个路径长度,这个数据是只读的,根据所有路径点计算出来的。
Waypoints :定义路径点的列表。
Position :位置,在路径局部空间中的位置(即相对于路径GameObject本身的变换)
Roll* :翻转角度。朝向的其他轴方向是从切线和世界的向上向量推断出来的。
- Dolly Cart参数
(只有Create Dolly Track With Cart才有)详解:
这是限制在 CinemachinePath的移动镜头。 它可用于为路径上的任何对象设置动画,或作为 Cinemachine 虚拟摄像机的跟随目标。这个组件就是把当前所附着的GameObject沿着path移动。
Speed :移动物体的速度。基于Position Unit设置的单位。如果速度不为0,则小车会根据速度自动移动。
Position :当前物体所处的位置。基于Position Unit设置的单位
- Position Units
Path Units :使用路径点的序号。比如0代表第一个路径点,1代表第二个路径点。
Distance :使用路径的总长度。
Normalized: 归一化。0代表路径最开始的位置,1代表路径结束的位置。
- Camera Up
- Default:不修改虚拟相机up方向,使用Cinemachine Brain的Override的World Up
- Path:使用路径当前的向上向量
- Path No Roll:使用路径节点当前的向上向量,Roll*为0
- Follow Target:使用跟随目标的向上向量
- Follow Target No Roll:使用跟随目标的向上向量,Roll*为0
不要修改虚拟摄像机的向上方向。 相反,使用 Cinemachine Brain 中的 World Up Override 属性
- Auto Dolly
Enabled:选中使用自动dolly,注意:这对性能可能会有一些影响,却决于Search Resolution
Position Offset:从路径最近点到跟随目标的偏移量
Search Radius:对当前路径点的n个单位点进行搜索,如果为0则为整条路径所有点
Search Resolution:Cinemachine 通过将片段分成许多直线来搜索片段。 数字越大,结果越准确。 但是,对于更高的数字,性能会成比例地变慢。
Transposer
这个算法将虚拟相机的坐标与跟随目标的坐标有固定的偏移量来进行跟随,也可以使用Damping属性
简单来说就是虚拟相机跟目标会有固定的位置差偏移
根据BindingMode的不同选择会有不同参数的Damping可以调整
Binding Mode 各种模式可以参考上面Orbital Transposer 的详细介绍